/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejercicioblocnotas;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.text.Caret;

/**
 *
 * @author AdminLocal
 */
public class BlocDeNotas extends JFrame
{

    JTextArea texto = null;
    private ventanaDialogo dialog;

    public BlocDeNotas()
    {
        super();
        this.setSize(new Dimension(800, 600));
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        inicializarComponentes();
    }

    public void inicializarComponentes()
    {
        añadirMenu();
        añadirTextArea();
    }

    public void añadirMenu()
    {
        JMenu menuArchivo = crearMenu("Archivo", 'A');
        menuArchivo.add(crearElementoMenu("Abrir", 'O', 'b', "open.jpeg"));
        menuArchivo.add(crearElementoMenu("Guardar", 'S', 'G'));
        menuArchivo.add(crearElementoMenu("Exit", 'E', 'E'));

        JMenu menuEditar = crearMenu("Editar", 'E');
        menuEditar.add(new AccionEdicion("Copiar", "copy.gif"));
        menuEditar.add(new AccionEdicion("Cortar", "cut.gif"));
        menuEditar.add(new AccionEdicion("Pegar", "paste.gif"));
        menuEditar.addSeparator();
        menuEditar.add(crearElementoMenu("Buscar", 'B', 'c'));
        menuEditar.add(crearElementoMenu("Reemplazar", 'P', 'p'));
        JMenu menuAyuda = crearMenu("Ayuda", 'y');
        menuAyuda.add(crearElementoMenu("Acerca de", 'R', 'r'));
        JMenuBar barraMenus = new JMenuBar();
        barraMenus.add(menuArchivo);
        barraMenus.add(menuEditar);
        barraMenus.add(menuAyuda);
        setJMenuBar(barraMenus);
        validate();
    }

    public JMenu crearMenu(String nombre, char mnemonico)
    {
        JMenu aux = new JMenu(nombre);
        aux.setMnemonic(mnemonico);
        return aux;
    }

    public JMenuItem crearElementoMenu(String nombre, char pulsacion, char mnemonico, String ico)
    {
        JMenuItem elementoMenu = new JMenuItem();
        Icon iconoMenu = new ImageIcon(ico);
        elementoMenu.setIcon(iconoMenu);
        elementoMenu.setName(nombre);
        elementoMenu.setAccelerator(KeyStroke.getKeyStroke("ctrl " + pulsacion));
        elementoMenu.setMnemonic(mnemonico);
        elementoMenu.setText(nombre);
        elementoMenu.addActionListener(new OyenteArchivo());
        return elementoMenu;
    }

    public JMenuItem crearElementoMenu(String nombre, char pulsacion, char mnemonico)
    {
        JMenuItem elementoMenu = new JMenuItem();
        elementoMenu.setName(nombre);
        elementoMenu.setAccelerator(KeyStroke.getKeyStroke("ctrl " + pulsacion));
        elementoMenu.setMnemonic(mnemonico);
        elementoMenu.setText(nombre);
        elementoMenu.addActionListener(new OyenteArchivo());
        return elementoMenu;
    }

    private void añadirTextArea()
    {
        texto = new JTextArea(8, 30);
        texto.setLineWrap(true);
        JScrollPane panel = new JScrollPane(texto);
        add(panel);
    }

    private class OyenteArchivo implements ActionListener
    {

        FileNameExtensionFilter filtro;

        public void actionPerformed(ActionEvent e)
        {
            filtro = new FileNameExtensionFilter("Ficheros de texto", "txt", "java");
            String comando = e.getActionCommand();
            if (comando.equals("Abrir"))
            {
                File fichero = null;
                FileReader entrada1;
                Scanner lector = null;
                JFileChooser eleccion;
                eleccion = new JFileChooser();
                eleccion.addChoosableFileFilter(filtro);
                if (eleccion.showOpenDialog(BlocDeNotas.this) == JFileChooser.APPROVE_OPTION)
                {
                    fichero = eleccion.getSelectedFile();
                    try
                    {
                        if (!fichero.exists())
                        {
                            fichero.createNewFile();
                        }
                        entrada1 = new FileReader(fichero);
                        lector = new Scanner(entrada1);
                        texto.setText("");
                        while (lector.hasNextLine())
                        {
                            texto.append(lector.nextLine());
                        }
                    } catch (IOException ex)
                    {
                        Logger.getLogger(BlocDeNotas.class.getName()).log(Level.SEVERE, null, ex);
                    } finally
                    {
                        lector.close();
                    }
                }

            } else if (comando.equals("Guardar"))
            {
                FileWriter salida1;
                PrintWriter salida = null;
                File fichero = null;
                JFileChooser eleccion;
                eleccion = new JFileChooser();
                eleccion.addChoosableFileFilter(filtro);
                if (eleccion.showSaveDialog(BlocDeNotas.this) == JFileChooser.APPROVE_OPTION)
                {
                    fichero = eleccion.getSelectedFile();
                }
                if (!fichero.exists())
                {
                    try
                    {
                        fichero.createNewFile();
                        salida1 = new FileWriter(fichero);
                        salida = new PrintWriter(salida1);
                    } catch (IOException ex)
                    {
                        Logger.getLogger(BlocDeNotas.class.getName()).log(Level.SEVERE, null, ex);
                    }
                } else
                {
                    try
                    {
                        salida1 = new FileWriter(fichero);
                        salida = new PrintWriter(salida1);
                    } catch (IOException ex)
                    {
                        Logger.getLogger(BlocDeNotas.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                salida.println(texto.getText());
                salida.flush();
                salida.close();
            } else if (comando.equals("Buscar"))
            {
                BuscarTexto buscar = new BuscarTexto();
                buscar.BuscarTextArea();
            } else if (comando.equals("Reemplazar"))
            {
                BuscarTexto reemplazar = new BuscarTexto();
                reemplazar.reemplazarTexto();
            } else if (comando.equals("Acerca de"))
            {
                if (dialog == null) // first time
                {
                    dialog = new ventanaDialogo(BlocDeNotas.this);
                }
                dialog.setVisible(true); // pop up dialog
            } else if (comando.equals("Exit"))
            {
                System.exit(0);
            }

        }
    }

    private class AccionEdicion extends AbstractAction
    {

        public AccionEdicion(String name, String img)
        {
            super(name);
            this.putValue(Action.SMALL_ICON, new ImageIcon(img));

        }

        public void actionPerformed(ActionEvent e)
        {
            if (e.getActionCommand().equals("Copiar"))
            {
                texto.copy();
            } else if (e.getActionCommand().equals("Cortar"))
            {
                texto.cut();
            } else if (e.getActionCommand().equals("Pegar"))
            {
                texto.paste();

            }
        }
    }

    private class BuscarTexto
    {

        public void BuscarTextArea()
        {

            String textoAbuscar = texto.getSelectedText();

            if (textoAbuscar == null)
            {
                textoAbuscar = "";
            }
            textoAbuscar = JOptionPane.showInputDialog(texto, "Buscar texto:", textoAbuscar);
            String aux = texto.getText();

            if (aux.contains(textoAbuscar))
            {
                Caret seleccion = texto.getCaret();
                int posicionInicial = 0;
                if (seleccion.getDot() != seleccion.getMark())
                {
                    // Hay algo seleccionado
                    posicionInicial = seleccion.getDot();
                }
                int posicion = aux.indexOf(textoAbuscar, posicionInicial);
                if (posicion == -1)
                {
                    return;
                }
                texto.setCaretPosition(posicion);
                texto.moveCaretPosition(posicion + textoAbuscar.length());

            } else
            {
                JOptionPane.showMessageDialog(BlocDeNotas.this, "Palabra no encontrada");
            }
        }

        public void reemplazarTexto()
        {
            String textoAbuscar = texto.getSelectedText();
            String textoAreemplazar = null;

            if (textoAbuscar == null)
            {
                textoAbuscar = "";
            }
            textoAbuscar = JOptionPane.showInputDialog(texto, "Texto a reemplazar texto :", textoAbuscar);
            textoAreemplazar = JOptionPane.showInputDialog("Palabra de reemplazo :");
            String aux = texto.getText();

            if (aux.contains(textoAbuscar))
            {
                Caret seleccion = texto.getCaret();
                int posicionInicial = 0;
                if (seleccion.getDot() != seleccion.getMark())
                {
                    // Hay algo seleccionado
                    posicionInicial = seleccion.getMark();
                }
                int posicion = aux.indexOf(textoAbuscar, posicionInicial);
                if (posicion == -1)
                {
                    return;
                }
                texto.replaceRange(textoAreemplazar, posicion, posicion + textoAbuscar.length());

            } else
            {
                JOptionPane.showMessageDialog(BlocDeNotas.this, "Palabra no encontrada");
            }
        }
    }

    class ventanaDialogo extends JDialog
    {

        public ventanaDialogo(JFrame owner)
        {
            super(owner, "Acerca de", true);

            // add HTML label to center

            add(
                    new JLabel("<html><h1><i><center>Programación Java</center></i></h1><hr><center>Programa desarrollado por David Escudero</center></html>"), BorderLayout.CENTER);

            // Ok button closes the dialog

            JButton ok = new JButton("Ok");
            ok.addActionListener(new ActionListener()
            {

                public void actionPerformed(ActionEvent event)
                {
                    setVisible(false);
                }
            });

            // add Ok button to southern border

            JPanel panel = new JPanel();
            panel.add(ok);
            add(panel, BorderLayout.SOUTH);

            setSize(300, 250);
        }
    }
}
